/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxinline.servicos;

import br.com.foxinline.entidades.gtm.Imovel;
import br.com.foxinline.util.Caracter;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ejb.Stateless;
import javax.persistence.Query;

/**
 *
 * @author roniere
 */
@Stateless
public class ImovelServico extends GenericService<Imovel> {

    public ImovelServico() {
        super(Imovel.class);
    }

    public List<Imovel> existeUnidade(Imovel i) {
        String[] fator = i.getLocalizacaoCartografica().split("\\.");
        String f = fator[0] + "." + fator[1] + "." + fator[2] + "." + fator[3];
        String sql = "select e from Imovel e where e.localizacaoCartografica"
                + " like '" + f + "%' and e.isentoIptu not like '4' and e.isentoIptu not like '5' and "
                + " e.isentoIptu not like '6' and e.isentoIptu not like '7'"
                + " and e.isentoIptu not like '8'  ";
        return (List<Imovel>) getEntityManager().createQuery(sql).getResultList();
    }

    public BigDecimal areaconstruidaUnidades(Imovel i) {
        String[] fator = i.getLocalizacaoCartografica().split("\\.");
        String f = fator[0] + "." + fator[1] + "." + fator[2] + "." + fator[3];
        String sql = "select sum(e.areaDaUnidade) from Imovel e where e.localizacaoCartografica"
                + " like '" + f + "%'";
        return (BigDecimal) getEntityManager().createQuery(sql).getSingleResult();
    }

    public Long countImovel() {
        String sql = "select count(i) from Imovel i";
        return (Long) getEntityManager().createQuery(sql).getSingleResult();
    }

    public List<Imovel> getPendencias() {
        String sql = "select e from Imovel e JOIN e.codigoDoContribuinte c JOIN e.codigoLogradouro l where "
                + " length(c.cpfOuCnpj) < 11 or e.fatorLocalizacao < 10 "
                + " or (e.codigoLogradouro is null or l.nomeLogradouro like '')"
                + " or e.codigoDaPedologia != 4 or (e.codRevestimento = 4 or e.codRevestimento = 5 or e.codRevestimento = 1)"
                + " or e.codigoDaCobertura = 1 or e.codigoInstSanitaria = 1 or e.codigoTipoConstrucao = 2"
                + " or e.codEstadoConservacao = 3 or e.codInstEletrica =  1"
                + " or e.calcamento like 'N' or e.iluminacaoPublica like 'N' or e.limpezaPublica like 'N'"
                + " or e.coletaDeLixo like 'N'";
        return (List<Imovel>) getEntityManager().createQuery(sql).getResultList();
    }

    public Imovel getProximoImovelPendente(String ids) {

        //imovel.getFatorLocalizacao() != 18 && imovel.getFatorLocalizacao() != 24 &&
        //imovel.getFatorLocalizacao() != 12
        String sql = "select e from Imovel e JOIN e.codigoDoContribuinte c "
                // + "JOIN e.codigoLogradouro l"

                + " where "
                + " (length(c.cpfOuCnpj) < 11 or"
                //                + " (e.fatorLocalizacao != 18 and e.fatorLocalizacao != 24 and e.fatorLocalizacao != 12)"
                //                + " or (e.codigoLogradouro is null or l.nomeLogradouro like '')"
                + " e.codigoDaPedologia != 4 )"
                //                + " or (e.codRevestimento = 4 or e.codRevestimento = 5 or e.codRevestimento = 1)"
                //                + " or e.codigoDaCobertura = 1 or e.codigoInstSanitaria = 1 or e.codigoTipoConstrucao = 2"
                //                + " or e.codEstadoConservacao = 3 or e.codInstEletrica =  1"
                //                + " or e.calcamento like 'N' or e.iluminacaoPublica like 'N' or e.limpezaPublica like 'N'"
                //                + " or e.coletaDeLixo like 'N')"
                + " and e.atualizado is null "
                + " and e.visualizado = false";


        if (ids != null && !ids.isEmpty() && !Caracter.removecaracter(ids.trim()).replace(" ", "").isEmpty()) {
            sql += " and e.id not in ".concat(ids);
        }

        sql += " order by e.id asc";
        System.err.println(sql);

        Query query = getEntityManager().createQuery(sql).setMaxResults(1);

        return (Imovel) query.getSingleResult();
    }

    public List<Imovel> getImoveisAtualizados() {

        String sql = "SELECT i FROM Imovel i JOIN i.codigoDoBairro b WHERE "
                + " (b.id = 25 OR b.id = 26 OR b.id = 27 OR b.id = 39 OR b.id = 17 OR b.id = 34 OR"
                + " b.id = 12 OR b.id = 10 OR b.id = 18 OR b.id = 25 OR b.id = 2 OR b.id = 13 OR "
                + " b.id = 3481 OR b.id = 5 OR b.id = 3376 OR b.id = 37 OR "
                + " b.id = 32 OR b.id = 38 OR b.id = 8 OR b.id = 1013 OR b.id = 1 OR"
                + " b.id = 22 OR b.id = 3 OR b.id = 14 OR b.id = 35 OR b.id = 9 OR"
                + " b.id = 1088 ) and (i.codigoDaUtilizacao = 2 or i.codigoDaUtilizacao = 3 OR"
                + " i.codigoDaUtilizacao = 4 or i.codigoDaUtilizacao = 5) and "
                + "(i.codigoDaOcupacao = 3 or i.codigoDaOcupacao = 2) and "
                + " ( i.codigoPisoAntigo is not null or i.codigoDaCoberturaAntigo is not null"
                + "   or i.codigoDaEstruturaAntigo is not null or i.codigoInstSanitariaAntigo is not null or"
                + " i.codigoTipoConstrucaoAntigo is not null or  i.codRevestimentoAntigo is not null) ";

        return (List<Imovel>) getEntityManager().createQuery(sql).getResultList();
    }

    /**
     * --0 - Não isento --1 - isento informado no bci iptu --2 - isento servidor
     * municipal --3 - viuva --4 - cancelado - motivo desconhecido --5 -
     * cancelado - mudanca de lote --6 - cancelado - imovel foi unificado --7 -
     * cancelado - comercio nao existe mais --8 - cancelado - residencia
     * inexistente --9 - isento dominio da uniao
     */
    public BigDecimal getValorTotalImovelAtualizado() {
        //Exclui os cancelados
        String sql = "SELECT SUM(ip.valorBaseCorrigido) FROM Imovel i JOIN i.iptuNovo ip where "
                + " i.isentoIptu not like '4' and i.isentoIptu not like '5' and"
                + " i.isentoIptu not like '6' and i.isentoIptu not like '7' and i.isentoIptu not like '8'";

        String sql1 = "SELECT COUNT(ip) FROM Imovel i JOIN i.iptuNovo ip where "
                + " i.isentoIptu not like '4' and i.isentoIptu not like '5' and"
                + " i.isentoIptu not like '6' and i.isentoIptu not like '7' and i.isentoIptu not like '8'";

        System.err.println("QUANTIDADE: " + (Long) getEntityManager().createQuery(sql1).getSingleResult());
        return (BigDecimal) getEntityManager().createQuery(sql).getSingleResult();

    }

    public Long getValorPorIsencoes(int isencao) {
        String sql1 = "SELECT COUNT(i) FROM Imovel i WHERE  i.isentoIptu = :isencao";

        Query createQuery = getEntityManager().createQuery(sql1);
        createQuery.setParameter("isencao", "" + isencao);

        return ((Long) createQuery.getSingleResult());

    }

    public BigDecimal getValorTotalImovelNormal() {
        //Exclui os cancelados
        String sql = "SELECT SUM(ip.valorBaseCorrigido) FROM Imovel i JOIN i.iptu ip WHERE "
                + " ( i.isentoIptu  not like '4' and i.isentoIptu not like '5' and"
                + " i.isentoIptu not like '6' and i.isentoIptu not like '7' and i.isentoIptu not like '8')";

        return (BigDecimal) getEntityManager().createQuery(sql).getSingleResult();

    }

    public BigDecimal getValorTotalImovelComFatorLocalizacaoAtualizado() {
        //Exclui os cancelados
        String sql = "SELECT SUM(ip.valorBaseCorrigido) FROM Imovel i JOIN i.iptuComFatorModificado ip WHERE "
                + " ( i.isentoIptu  not like '4' and i.isentoIptu not like '5' and"
                + " i.isentoIptu not like '6' and i.isentoIptu not like '7' and i.isentoIptu not like '8')";

        return (BigDecimal) getEntityManager().createQuery(sql).getSingleResult();

    }

    public BigDecimal getValorTotalImovelComAjustes() {
        //Exclui os cancelados
        String sql = "SELECT SUM(ip.valorBaseCorrigido) FROM Imovel i JOIN i.iptuComAjustesNoBairro ip WHERE "
                + " ( i.isentoIptu  not like '4' and i.isentoIptu not like '5' and"
                + " i.isentoIptu not like '6' and i.isentoIptu not like '7' and i.isentoIptu not like '8')";

        return (BigDecimal) getEntityManager().createQuery(sql).getSingleResult();

    }

    public void atualizarInformacoesImovel() {

        Map<Integer, Integer> mp = new HashMap<Integer, Integer>();

        String sql = "SELECT i FROM Imovel i JOIN i.codigoDoBairro b WHERE "
                + " (b.id = 25 OR b.id = 26 OR b.id = 27 OR b.id = 39 OR b.id = 17 OR b.id = 34 OR"
                + " b.id = 12 OR b.id = 10 OR b.id = 18 OR b.id = 25 OR b.id = 2 OR b.id = 13 OR "
                + " b.id = 3481 OR b.id = 5 OR b.id = 3376 OR b.id = 37 OR "
                + " b.id = 32 OR b.id = 38 OR b.id = 8 OR b.id = 1013 OR b.id = 1 OR"
                + " b.id = 22 OR b.id = 3 OR b.id = 14 OR b.id = 35 OR b.id = 9 OR"
                + " b.id = 1088 ) and (i.codigoDaUtilizacao = 2 or i.codigoDaUtilizacao = 3 OR"
                + " i.codigoDaUtilizacao = 4 or i.codigoDaUtilizacao = 5) and (i.codigoDaOcupacao = 3 or i.codigoDaOcupacao = 2)";



        for (Imovel i : (List<Imovel>) getEntityManager().createQuery(sql).getResultList()) {

//            if(i.getCodigoDoBairro() != null && mp.get(i.getCodigoDoBairro().getId()) > i.getFatorLocalizacao()){
//               i.setFatorLocalizacaoNovo(mp.get(i.getFatorLocalizacao()));
//            }


            //PISO
            if (i.getCodigoPisoAntigo() != null && i.getCodigoPisoAntigo() == 4) {
                i.setCodigoPiso(i.getCodigoPisoAntigo());
                i.setCodigoPisoAntigo(null);
            }
            if (i.getCodigoPiso() != 3 && i.getCodigoPiso() != 0 && i.getCodigoPiso() != 4) {
                i.setCodigoPisoAntigo(i.getCodigoPiso());
                i.setCodigoPiso(3);
            }
            //COBERTURA
            if (i.getCodigoDaCobertura() == 1 || i.getCodigoDaCobertura() == 2) {
                i.setCodigoDaCoberturaAntigo(i.getCodigoDaCobertura());
                i.setCodigoDaCobertura(3);
            }
            //INSTALCAO SANITARIA
            if (i.getCodigoInstSanitaria() == 1 || i.getCodigoInstSanitaria() == 2) {
                i.setCodigoInstSanitariaAntigo(i.getCodigoInstSanitaria());
                i.setCodigoInstSanitaria(3);
            }
            //CONSTRUCAO
            if (i.getCodigoTipoConstrucao() == 2 || i.getCodigoTipoConstrucao() == 3) {
                i.setCodigoTipoConstrucaoAntigo(i.getCodigoTipoConstrucao());
                i.setCodigoTipoConstrucao(1);
            }

            //CONSERVACAO
            if (i.getCodEstadoConservacao() == 3 || i.getCodEstadoConservacao() == 2) {
                i.setCodEstadoConservacaoAntigo(i.getCodEstadoConservacao());
                i.setCodEstadoConservacao(1);
            }

            //INST ELETRICA
            if (i.getCodInstEletrica() == 1 || i.getCodInstEletrica() == 2) {
                i.setCodInstEletricaAntigo(i.getCodInstEletrica());
                i.setCodInstEletrica(3);
            }

            //REV EXTERNO
            if (i.getCodRevestimentoAntigo() != null && i.getCodRevestimentoAntigo() == 5) {
                i.setCodRevestimento(i.getCodRevestimentoAntigo());
                i.setCodRevestimentoAntigo(null);
            }
            if (i.getCodRevestimento() == 1 || i.getCodRevestimento() == 4) {
                i.setCodRevestimentoAntigo(i.getCodRevestimento());
                i.setCodRevestimento(3);
            }

            //ESTRUTURA
            if (i.getCodigoDaEstruturaAntigo() != null && i.getCodigoDaEstruturaAntigo() == 4) {
                i.setCodigoDaEstrutura(4);
                i.setCodigoDaEstruturaAntigo(null);
            }
            if (i.getCodigoDaEstrutura() == 3) {
                i.setCodigoDaEstruturaAntigo(i.getCodigoDaEstrutura());
                i.setCodigoDaEstrutura(2);
            }

            //CALCAMENTO
            if (i.getCalcamento().equalsIgnoreCase("N")) {
                i.setCalcamentoAntigo("N");
                i.setCalcamento("S");
            }

            if (i.getCalcamento().equalsIgnoreCase("N")) {
                i.setCalcamentoAntigo("N");
                i.setCalcamento("S");
            }

            //ILUMINACAO PUBLICA
            if (i.getIluminacaoPublica().equalsIgnoreCase("N")) {
                i.setIluminacaoPublicaAntigo("N");
                i.setIluminacaoPublica("S");
            }

            //LIMPEZA PUBLICA 
            if (i.getLimpezaPublica().equalsIgnoreCase("N")) {
                i.setLimpezaPublicaAntigo("N");
                i.setLimpezaPublica("S");
            }

            // COLETA DE LIXO
            if (i.getColetaDeLixo().equalsIgnoreCase("N")) {
                i.setColetaDeLixoAntigo("N");
                i.setColetaDeLixo("S");
            }


            update(i);

        }


    }

    public Imovel getByLocalizacao(String fator) {
        String sql = "select i from Imovel i where i.localizacaoCartografica"
                + " like '" + fator + "' and i.isentoIptu not like '4' and i.isentoIptu not like '5' and"
                + " i.isentoIptu not like '6' and i.isentoIptu not like '7' and i.isentoIptu not like '8'";

        Imovel i = null;
        i = (Imovel) getEntityManager().createQuery(sql).getSingleResult();

        return i;
    }
}
